<?php

require_once("cfg/cfg.php");
require_once("lib/mysql.class.php");
require_once("lib/timer.class.php");
require_once("lib/logger.class.php");


class Caller
{
    public $timeout_sec = 30;
    
    private $phone = "";
    
    public function __construct($phone)
    {
        $this->init();
        $this->phone = str_replace("+", "", $phone);
    }
    
    
    public function wait($delay)
    {
        // начало ожидания
        $reg_dt = date("Y-m-d H:i:s");
        
        // опрос базы только определенное время
        $timer = new Timer(true);
        while(true)
        {
            // сколько прошло?
            $sec = $timer->stop();
            
            // а был ли звонок с телефона?
            $http_dt = $this->check_call();
            // был?
            if($http_dt !== false)
            {
                // записываем в лог текущее время
                $this->ins_log($http_dt, date("Y-m-d H:i:s"));
                // удаляем из кучи номер
                $this->del_heap();
                // возвращаем истину (звонок был!)
                return true;
            }
            
            // если прошло больше времени чем разрешено 
            if($sec > $delay)
            {
                // записывает неуспешную попытку в лог
                $this->ins_log($reg_dt);
                $this->del_heap();
                return false;
            }
            
            sleep(2);
        }
    }
    
    private function init()
    {
        MySQL::$url = DBURL;
        $this->db = MySQL::getInstance();
        Logger::$log_file = USR_LOG_FILE;
    }
    
    public function check_call()
    {
        // а был ли звонок с телефона
        $sql = "SELECT dt FROM callers_heap WHERE phone = ".$this->phone." AND called = 'Y'";
        $this->show2($sql);
        $res = $this->db->query($sql);
        if($this->db->num_rows($res) > 0)
        {
            $row = $this->db->fetch_row($res);
            return $row[0];
        }
        else
            return false;
    }
    
    // регистрация звонка с телефона
    public function reg_call()
    {
        Logger::Write("REG call", $this->phone);
        $call_dt = date("Y-m-d H:i:s");
        // зарегистрирован ли номер телефона в куче
        $http_dt = $this->exists_in_heap();
        // да!
        if($http_dt)
        {
            // обновляем признак звонка у телефона в куче
            $this->upd_heap();
            //$this->ins_log($http_dt, $call_dt);
            //$this->del_heap();
            
            return true;
        }
        // нет! телефон в куче не найден.
        else
        {
            // записываем звонок с телефона сразу в лог
            $this->ins_log(null, $call_dt);
            
            return false;
        }
    }
    
    // регистрация телефона в куче
    public function reg_http()
    {
	Logger::Write("REG http", $this->phone);
        // проверяем не был ли он зарегистрирован в куче ранее
        $http_dt = $this->exists_in_heap();
        // зарегистрирован!
        if($http_dt)
        {
            // переносим старую регистрацию в лог
            $this->ins_log($http_dt);
            // и удалем ее из кучи
            $this->del_heap();
        }
        // заносим в кучу новую запись
        $this->ins_heap();
    }
    
    // установка признака звонка с зарегистрированного в куче телефона
    private function upd_heap()
    {
        $sql = "UPDATE callers_heap SET called = 'Y' WHERE phone = ".$this->phone." AND dt > '".date("Y-m_d H:i:s", time() - $this->timeout_sec)."'";
        $this->show2($sql);
        $this->db->query($sql);
    }
    
    // проверка существования телефона в куче
    private function exists_in_heap()
    {
        $sql = "SELECT dt FROM callers_heap WHERE phone = ".$this->phone;
        $this->show2($sql);
        $res = $this->db->query($sql);
        if ($this->db->num_rows($res) === 0) return false;
        $row = $this->db->fetch_row($res);
        return $row[0];
    }
    
    // добавляем телефон в кучу
    private function ins_heap()
    {
        $sql = "INSERT INTO callers_heap(phone) VALUES(".$this->phone.")";
        $this->show2($sql);
        $res = $this->db->query($sql);
    }
    
    private function del_heap()
    {
        $sql = "DELETE FROM callers_heap WHERE phone = (".$this->phone.")";
        $this->show2($sql);
        $res = $this->db->query($sql);
    }
    
    public function ins_log($http_dt, $call_dt = null)
    {
        $sql = "INSERT INTO callers_log(call_dt, http_dt, phone) VALUES(%s, %s, %s)";
		$params = array(
			$this->db->escape($call_dt),
			$this->db->escape($http_dt),
			$this->db->escape($this->phone)
			);
		$sql = vsprintf($sql, $params);
        $this->show2($sql);
        
        $res = $this->db->query($sql);
    }

    public function get_user_id()
    {
        $sql = "SELECT uid FROM users WHERE phone = ".$this->phone;
        $res = $this->db->query($sql);
        $this->show2($sql);
        if($this->db->num_rows($res) === 0) return null;
        $row = $this->db->fetch_row($res);
        return $row[0];
    }
   
    private function heap2log()
    {
        $this->ins_log();
        $this->del_heap();
    }
    
    private function show2($msg)
    {
	Logger::Write("SQL", $msg);
        //echo $msg."\n";
    }
    
    private $db = null;
    
}
